#include <REGX52.H>
#include "AT24C02.h"
#include "NiXie.h"
#include "Delay.h"
#include "Key.h"
#include "Timer0.h"

unsigned char KeyNum;           //获取按键
unsigned char Min,Sec,MiniSec;  //秒表的数值
unsigned char WalkFlag;         //控制秒表的走停

void main()
{
    Timer0_Init();      //定时器初始化
    while(1)
    {
        KeyNum = Key();     //获取按键
        if (1 == KeyNum)    //当按K1的时候
        {
            WalkFlag = !WalkFlag; //控制秒表走停
        }
        if (2 == KeyNum)    //当按K2的时候
        {
            WalkFlag = 0;       //让秒表停止
            Min = 0;            //秒表
            Sec = 0;            //‘清’
            MiniSec = 0;        //‘零’
        }
        if (3 == KeyNum)//当按K1的时候
        {
            AT24C02_WriteByte(0,Min);        //将Min的数据存到地址0
            Delay(5);
            AT24C02_WriteByte(1,Sec);        //将Sec的数据存到地址1
            Delay(5);
            AT24C02_WriteByte(2,MiniSec);    //将MiniSec的数据存到地址2
            Delay(5);
        }
        if (4 == KeyNum)//当按K1的时候
        {
            Min = AT24C02_ReadByte(0);      //读出地址0的数据
            Sec = AT24C02_ReadByte(1);      //读出地址1的数据
            MiniSec = AT24C02_ReadByte(2);  //读出地址2的数据
        }
        NiXie(1,Min/10);        //分的十位
        NiXie(2,Min%10);        //分的个位
        NiXie(3,11);            //杠
        NiXie(4,Sec/10);        //秒的十位
        NiXie(5,Sec%10);        //秒的个位
        NiXie(6,11);            //杠
        NiXie(7,MiniSec/10);    //小秒的十位
        NiXie(8,MiniSec%10);    //小秒的个位
    }
}

/**
  * @brief   秒表驱动函数，在中断中调用
  * @param   无
  * @retval  无
  */
void Sec_Loop()
{
    if (WalkFlag)       //控制秒表走停
    {
        MiniSec++;      //小秒加1
        if (MiniSec >= 100)//判断进位
        {
            MiniSec = 0;    //小秒清零
            Sec++;          //秒加1
            if (Sec >= 60)  //判断进位
            {
                Sec = 0;    //秒清零
                Min++;      //分加1
                if (Min >= 60)  //判断清零
                {
                    Min = 0;    //分清零
                }
            }
        }
    }
}

void Timer0_Rountine() interrupt 1
{
    static unsigned int T0Count1 = 0;   //用于独立按键
    static unsigned int T0Count2 = 0;   //用于数码管
    static unsigned int T0Count3 = 0;   //用于秒表

    TL0 = 0x66;     //设置定时初值
    TH0 = 0xFC;     //设置定时初值

    T0Count1++;
    if (T0Count1 >= 20) //独立按键扫描
    {
        T0Count1 = 0;
        Key_Loop();
    }

    T0Count2++;
    if (T0Count2 >= 2) //数码管扫描
    {
        T0Count2 = 0;
        NiXie_Loop();
    }

    T0Count3++;
    if (T0Count3 >= 10) //秒表计数
    {
        T0Count3 = 0;
        Sec_Loop();
    }
}






















